//    Openbravo POS is a point of sales application designed for touch screens.
//    Copyright (C) 2007-2009 Openbravo, S.L.
//    http://www.openbravo.com/product/pos
//
//    This file is part of Openbravo POS.
//
//    Openbravo POS is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    Openbravo POS is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with Openbravo POS.  If not, see <http://www.gnu.org/licenses/>.

package org.openpos.reports.closemonth;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.swing.ComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;

import com.openbravo.basic.BasicException;
import com.openbravo.data.gui.MessageInf;
import com.openbravo.data.gui.TableRendererBasic;
import com.openbravo.format.Formats;
import com.openbravo.pos.forms.AppLocal;
import com.openbravo.pos.forms.AppView;
import com.openbravo.pos.forms.BeanFactoryApp;
import com.openbravo.pos.forms.BeanFactoryException;
import com.openbravo.pos.forms.DataLogicSystem;
import com.openbravo.pos.forms.JPanelView;
import com.openbravo.pos.panels.PaymentsModel;
import com.openbravo.pos.printer.TicketParser;
import com.openbravo.pos.printer.TicketPrinterException;
import com.openbravo.pos.scripting.ScriptEngine;
import com.openbravo.pos.scripting.ScriptException;
import com.openbravo.pos.scripting.ScriptFactory;

/**
 * 
 * @author adrianromero
 */
public class JPanelCloseMonth extends JPanel implements JPanelView, BeanFactoryApp {

	private static final int BASE_YEAR = 2008;
	private static final String PRINTER_MONTHLY_REPORT = "Printer.MonthlyReport";
	private AppView m_App;
	private DataLogicSystem m_dlSystem;

	private PaymentsModel m_PaymentsToClose = PaymentsModel.emptyInstance();

	private TicketParser m_TTP;
	private int currentMonth;
	private int currentYear;

	/** Creates new form JPanelCloseMoney */
	public JPanelCloseMonth() {

		initComponents();
	}

	@Override
	public void init(AppView app) throws BeanFactoryException {

		m_App = app;
		m_dlSystem = (DataLogicSystem)m_App.getBean("com.openbravo.pos.forms.DataLogicSystem");
		m_TTP = new TicketParser(m_App.getDeviceTicket(), m_dlSystem);

		m_jTicketTable.setDefaultRenderer(Object.class, new TableRendererBasic(new Formats[] { new FormatsPayment(),
				Formats.CURRENCY }));
		m_jTicketTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		m_jScrollTableTicket.getVerticalScrollBar().setPreferredSize(new Dimension(25, 25));
		m_jTicketTable.getTableHeader().setReorderingAllowed(false);
		m_jTicketTable.setRowHeight(25);
		m_jTicketTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		m_jsalestable.setDefaultRenderer(Object.class, new TableRendererBasic(new Formats[] { Formats.STRING,
				Formats.CURRENCY, Formats.CURRENCY, Formats.CURRENCY }));
		m_jsalestable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		m_jScrollSales.getVerticalScrollBar().setPreferredSize(new Dimension(25, 25));
		m_jsalestable.getTableHeader().setReorderingAllowed(false);
		m_jsalestable.setRowHeight(25);
		m_jsalestable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	}

	@Override
	public Object getBean() {
		return this;
	}

	@Override
	public JComponent getComponent() {
		return this;
	}

	@Override
	public String getTitle() {
		return AppLocal.getIntString("Menu.CloseTPV");
	}

	@Override
	public void activate() throws BasicException {
		loadData();
	}

	@Override
	public boolean deactivate() {
		// se me debe permitir cancelar el deactivate   
		return true;
	}

	private void loadData() throws BasicException {

		// Reset
		m_jMinDate.setText(null);
		m_jMaxDate.setText(null);
		m_jPrintCash.setEnabled(false);
		m_jCount.setText(null); // AppLocal.getIntString("label.noticketstoclose");
		m_jCash.setText(null);

		m_jSales.setText(null);
		m_jSalesSubtotal.setText(null);
		m_jSalesTaxes.setText(null);
		m_jSalesTotal.setText(null);

		m_jTicketTable.setModel(new DefaultTableModel());
		m_jsalestable.setModel(new DefaultTableModel());

		// Populate Data
		m_jMinDate.setText(m_PaymentsToClose.printDateStart());
		m_jMaxDate.setText(m_PaymentsToClose.printDateEnd());

		if (m_PaymentsToClose.getPayments() != 0 || m_PaymentsToClose.getSales() != 0) {

			m_jPrintCash.setEnabled(true);

			m_jCount.setText(m_PaymentsToClose.printPayments());
			m_jCash.setText(m_PaymentsToClose.printPaymentsTotal());

			m_jSales.setText(m_PaymentsToClose.printSales());
			m_jSalesSubtotal.setText(m_PaymentsToClose.printSalesBase());
			m_jSalesTaxes.setText(m_PaymentsToClose.printSalesTaxes());
			m_jSalesTotal.setText(m_PaymentsToClose.printSalesTotal());
		}

		m_jTicketTable.setModel(m_PaymentsToClose.getPaymentsModel());

		TableColumnModel jColumns = m_jTicketTable.getColumnModel();
		jColumns.getColumn(0).setPreferredWidth(200);
		jColumns.getColumn(0).setResizable(false);
		jColumns.getColumn(1).setPreferredWidth(100);
		jColumns.getColumn(1).setResizable(false);

		m_jsalestable.setModel(m_PaymentsToClose.getSalesModel());

		jColumns = m_jsalestable.getColumnModel();
		jColumns.getColumn(0).setPreferredWidth(100);
		jColumns.getColumn(0).setResizable(false);
		jColumns.getColumn(1).setPreferredWidth(100);
		jColumns.getColumn(1).setResizable(false);
		jColumns.getColumn(2).setPreferredWidth(100);
		jColumns.getColumn(2).setResizable(false);
	}

	private void printPayments(String report) {

		String sresource = m_dlSystem.getResourceAsXML(report);
		if (sresource == null) {
			MessageInf msg = new MessageInf(MessageInf.SGN_WARNING, AppLocal.getIntString("message.cannotprintticket"));
			msg.show(this);
		}
		else {
			try {
				ScriptEngine script = ScriptFactory.getScriptEngine(ScriptFactory.VELOCITY);
				script.put("payments", m_PaymentsToClose);
				m_TTP.printTicket(script.eval(sresource).toString());
			}
			catch (ScriptException e) {
				MessageInf msg = new MessageInf(MessageInf.SGN_WARNING,
						AppLocal.getIntString("message.cannotprintticket"), e);
				msg.show(this);
			}
			catch (TicketPrinterException e) {
				MessageInf msg = new MessageInf(MessageInf.SGN_WARNING,
						AppLocal.getIntString("message.cannotprintticket"), e);
				msg.show(this);
			}
		}
	}

	private class FormatsPayment extends Formats {

		@Override
		protected String formatValueInt(Object value) {
			return AppLocal.getIntString("transpayment." + (String)value);
		}

		@Override
		protected Object parseValueInt(String value) throws ParseException {
			return value;
		}

		@Override
		public int getAlignment() {
			return javax.swing.SwingConstants.LEFT;
		}
	}

	/**
	 * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The
	 * content of this method is always regenerated by the Form Editor.
	 */
	// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
	private void initComponents() {

		jPanel1 = new javax.swing.JPanel();
		jPanel4 = new javax.swing.JPanel();
		jLabel11 = new javax.swing.JLabel();
		m_jSequence = createMonthSelection();
		jLabel2 = new javax.swing.JLabel();
		m_jMinDate = new javax.swing.JTextField();
		jLabel3 = new javax.swing.JLabel();
		m_jMaxDate = new javax.swing.JTextField();
		jPanel5 = new javax.swing.JPanel();
		m_jScrollTableTicket = new javax.swing.JScrollPane();
		m_jTicketTable = new javax.swing.JTable();
		jLabel1 = new javax.swing.JLabel();
		m_jCount = new javax.swing.JTextField();
		jLabel4 = new javax.swing.JLabel();
		m_jCash = new javax.swing.JTextField();
		jPanel6 = new javax.swing.JPanel();
		m_jSalesTotal = new javax.swing.JTextField();
		m_jScrollSales = new javax.swing.JScrollPane();
		m_jsalestable = new javax.swing.JTable();
		m_jSalesTaxes = new javax.swing.JTextField();
		m_jSalesSubtotal = new javax.swing.JTextField();
		m_jSales = new javax.swing.JTextField();
		jLabel5 = new javax.swing.JLabel();
		jLabel6 = new javax.swing.JLabel();
		jLabel12 = new javax.swing.JLabel();
		jLabel7 = new javax.swing.JLabel();
		m_jPrintCash = new javax.swing.JButton();

		setLayout(new java.awt.BorderLayout());

		jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(AppLocal.getIntString("label.datestitle"))); // NOI18N

		jLabel11.setText(AppLocal.getIntString("label.sequence")); // NOI18N

		jLabel2.setText(AppLocal.getIntString("Label.StartDate")); // NOI18N

		m_jMinDate.setEditable(false);
		m_jMinDate.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

		jLabel3.setText(AppLocal.getIntString("Label.EndDate")); // NOI18N

		m_jMaxDate.setEditable(false);
		m_jMaxDate.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

		javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
		jPanel4.setLayout(jPanel4Layout);
		jPanel4Layout
				.setHorizontalGroup(jPanel4Layout
						.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								jPanel4Layout
										.createSequentialGroup()
										.addContainerGap()
										.addGroup(
												jPanel4Layout
														.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
														.addGroup(
																jPanel4Layout
																		.createSequentialGroup()
																		.addComponent(jLabel11,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				140,
																				javax.swing.GroupLayout.PREFERRED_SIZE)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addComponent(m_jSequence,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				160,
																				javax.swing.GroupLayout.PREFERRED_SIZE))
														.addGroup(
																jPanel4Layout
																		.createSequentialGroup()
																		.addComponent(jLabel2,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				140,
																				javax.swing.GroupLayout.PREFERRED_SIZE)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addComponent(m_jMinDate,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				160,
																				javax.swing.GroupLayout.PREFERRED_SIZE))
														.addGroup(
																jPanel4Layout
																		.createSequentialGroup()
																		.addComponent(jLabel3,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				140,
																				javax.swing.GroupLayout.PREFERRED_SIZE)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addComponent(m_jMaxDate,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				160,
																				javax.swing.GroupLayout.PREFERRED_SIZE)))
										.addContainerGap(319, Short.MAX_VALUE)));
		jPanel4Layout.setVerticalGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(
						jPanel4Layout
								.createSequentialGroup()
								.addGroup(
										jPanel4Layout
												.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
												.addComponent(jLabel11)
												.addComponent(m_jSequence, javax.swing.GroupLayout.PREFERRED_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.PREFERRED_SIZE))
								.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addGroup(
										jPanel4Layout
												.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
												.addComponent(jLabel2)
												.addComponent(m_jMinDate, javax.swing.GroupLayout.PREFERRED_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.PREFERRED_SIZE))
								.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addGroup(
										jPanel4Layout
												.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
												.addComponent(jLabel3)
												.addComponent(m_jMaxDate, javax.swing.GroupLayout.PREFERRED_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.PREFERRED_SIZE))
								.addContainerGap(16, Short.MAX_VALUE)));

		jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder(AppLocal.getIntString("label.paymentstitle"))); // NOI18N

		m_jScrollTableTicket.setMinimumSize(new java.awt.Dimension(350, 140));
		m_jScrollTableTicket.setPreferredSize(new java.awt.Dimension(350, 140));

		m_jTicketTable.setFocusable(false);
		m_jTicketTable.setIntercellSpacing(new java.awt.Dimension(0, 1));
		m_jTicketTable.setRequestFocusEnabled(false);
		m_jTicketTable.setShowVerticalLines(false);
		m_jScrollTableTicket.setViewportView(m_jTicketTable);

		jLabel1.setText(AppLocal.getIntString("Label.Tickets")); // NOI18N

		m_jCount.setEditable(false);
		m_jCount.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

		jLabel4.setText(AppLocal.getIntString("Label.Cash")); // NOI18N

		m_jCash.setEditable(false);
		m_jCash.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

		javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
		jPanel5.setLayout(jPanel5Layout);
		jPanel5Layout
				.setHorizontalGroup(jPanel5Layout
						.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								jPanel5Layout
										.createSequentialGroup()
										.addContainerGap()
										.addComponent(m_jScrollTableTicket, javax.swing.GroupLayout.PREFERRED_SIZE,
												350, javax.swing.GroupLayout.PREFERRED_SIZE)
										.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
										.addGroup(
												jPanel5Layout
														.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
														.addGroup(
																jPanel5Layout
																		.createSequentialGroup()
																		.addComponent(jLabel1,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				90,
																				javax.swing.GroupLayout.PREFERRED_SIZE)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addComponent(m_jCount,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				100,
																				javax.swing.GroupLayout.PREFERRED_SIZE))
														.addGroup(
																jPanel5Layout
																		.createSequentialGroup()
																		.addComponent(jLabel4,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				90,
																				javax.swing.GroupLayout.PREFERRED_SIZE)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addComponent(m_jCash,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				100,
																				javax.swing.GroupLayout.PREFERRED_SIZE)))
										.addContainerGap(67, Short.MAX_VALUE)));
		jPanel5Layout
				.setVerticalGroup(jPanel5Layout
						.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								jPanel5Layout
										.createSequentialGroup()
										.addGroup(
												jPanel5Layout
														.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
														.addComponent(m_jScrollTableTicket,
																javax.swing.GroupLayout.PREFERRED_SIZE, 140,
																javax.swing.GroupLayout.PREFERRED_SIZE)
														.addGroup(
																jPanel5Layout
																		.createSequentialGroup()
																		.addGroup(
																				jPanel5Layout
																						.createParallelGroup(
																								javax.swing.GroupLayout.Alignment.BASELINE)
																						.addComponent(jLabel1)
																						.addComponent(
																								m_jCount,
																								javax.swing.GroupLayout.PREFERRED_SIZE,
																								javax.swing.GroupLayout.DEFAULT_SIZE,
																								javax.swing.GroupLayout.PREFERRED_SIZE))
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addGroup(
																				jPanel5Layout
																						.createParallelGroup(
																								javax.swing.GroupLayout.Alignment.BASELINE)
																						.addComponent(jLabel4)
																						.addComponent(
																								m_jCash,
																								javax.swing.GroupLayout.PREFERRED_SIZE,
																								javax.swing.GroupLayout.DEFAULT_SIZE,
																								javax.swing.GroupLayout.PREFERRED_SIZE))))
										.addContainerGap(16, Short.MAX_VALUE)));

		jPanel6.setBorder(javax.swing.BorderFactory.createTitledBorder(AppLocal.getIntString("label.salestitle"))); // NOI18N

		m_jSalesTotal.setEditable(false);
		m_jSalesTotal.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

		m_jsalestable.setFocusable(false);
		m_jsalestable.setIntercellSpacing(new java.awt.Dimension(0, 1));
		m_jsalestable.setRequestFocusEnabled(false);
		m_jsalestable.setShowVerticalLines(false);
		m_jScrollSales.setViewportView(m_jsalestable);

		m_jSalesTaxes.setEditable(false);
		m_jSalesTaxes.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

		m_jSalesSubtotal.setEditable(false);
		m_jSalesSubtotal.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

		m_jSales.setEditable(false);
		m_jSales.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

		jLabel5.setText(AppLocal.getIntString("label.sales")); // NOI18N

		jLabel6.setText(AppLocal.getIntString("label.subtotalcash")); // NOI18N

		jLabel12.setText(AppLocal.getIntString("label.taxcash")); // NOI18N

		jLabel7.setText(AppLocal.getIntString("label.totalcash")); // NOI18N

		javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
		jPanel6.setLayout(jPanel6Layout);
		jPanel6Layout
				.setHorizontalGroup(jPanel6Layout
						.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								jPanel6Layout
										.createSequentialGroup()
										.addContainerGap()
										.addComponent(m_jScrollSales, javax.swing.GroupLayout.PREFERRED_SIZE, 350,
												javax.swing.GroupLayout.PREFERRED_SIZE)
										.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
										.addGroup(
												jPanel6Layout
														.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
														.addGroup(
																jPanel6Layout
																		.createSequentialGroup()
																		.addComponent(jLabel5,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				90,
																				javax.swing.GroupLayout.PREFERRED_SIZE)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addComponent(m_jSales,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				100,
																				javax.swing.GroupLayout.PREFERRED_SIZE))
														.addGroup(
																jPanel6Layout
																		.createSequentialGroup()
																		.addComponent(jLabel6,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				90,
																				javax.swing.GroupLayout.PREFERRED_SIZE)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addComponent(m_jSalesSubtotal,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				100,
																				javax.swing.GroupLayout.PREFERRED_SIZE))
														.addGroup(
																jPanel6Layout
																		.createSequentialGroup()
																		.addComponent(jLabel12,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				90,
																				javax.swing.GroupLayout.PREFERRED_SIZE)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addComponent(m_jSalesTaxes,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				100,
																				javax.swing.GroupLayout.PREFERRED_SIZE))
														.addGroup(
																jPanel6Layout
																		.createSequentialGroup()
																		.addComponent(jLabel7,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				90,
																				javax.swing.GroupLayout.PREFERRED_SIZE)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addComponent(m_jSalesTotal,
																				javax.swing.GroupLayout.PREFERRED_SIZE,
																				100,
																				javax.swing.GroupLayout.PREFERRED_SIZE)))
										.addContainerGap(67, Short.MAX_VALUE)));
		jPanel6Layout
				.setVerticalGroup(jPanel6Layout
						.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								jPanel6Layout
										.createSequentialGroup()
										.addGroup(
												jPanel6Layout
														.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
														.addComponent(m_jScrollSales,
																javax.swing.GroupLayout.PREFERRED_SIZE, 140,
																javax.swing.GroupLayout.PREFERRED_SIZE)
														.addGroup(
																jPanel6Layout
																		.createSequentialGroup()
																		.addGroup(
																				jPanel6Layout
																						.createParallelGroup(
																								javax.swing.GroupLayout.Alignment.BASELINE)
																						.addComponent(jLabel5)
																						.addComponent(
																								m_jSales,
																								javax.swing.GroupLayout.PREFERRED_SIZE,
																								javax.swing.GroupLayout.DEFAULT_SIZE,
																								javax.swing.GroupLayout.PREFERRED_SIZE))
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addGroup(
																				jPanel6Layout
																						.createParallelGroup(
																								javax.swing.GroupLayout.Alignment.BASELINE)
																						.addComponent(jLabel6)
																						.addComponent(
																								m_jSalesSubtotal,
																								javax.swing.GroupLayout.PREFERRED_SIZE,
																								javax.swing.GroupLayout.DEFAULT_SIZE,
																								javax.swing.GroupLayout.PREFERRED_SIZE))
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addGroup(
																				jPanel6Layout
																						.createParallelGroup(
																								javax.swing.GroupLayout.Alignment.BASELINE)
																						.addComponent(jLabel12)
																						.addComponent(
																								m_jSalesTaxes,
																								javax.swing.GroupLayout.PREFERRED_SIZE,
																								javax.swing.GroupLayout.DEFAULT_SIZE,
																								javax.swing.GroupLayout.PREFERRED_SIZE))
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addGroup(
																				jPanel6Layout
																						.createParallelGroup(
																								javax.swing.GroupLayout.Alignment.BASELINE)
																						.addComponent(jLabel7)
																						.addComponent(
																								m_jSalesTotal,
																								javax.swing.GroupLayout.PREFERRED_SIZE,
																								javax.swing.GroupLayout.DEFAULT_SIZE,
																								javax.swing.GroupLayout.PREFERRED_SIZE))))
										.addContainerGap(16, Short.MAX_VALUE)));

		m_jPrintCash.setText(AppLocal.getIntString("Button.PrintMonthlyReport")); // NOI18N
		m_jPrintCash.addActionListener(new java.awt.event.ActionListener() {

			@Override
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				m_jPrintCashActionPerformed(evt);
			}
		});

		JButton changeMonthButton = createChangeMonthButton();

		javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
		jPanel1.setLayout(jPanel1Layout);
		jPanel1Layout
				.setHorizontalGroup(jPanel1Layout
						.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								jPanel1Layout
										.createSequentialGroup()
										.addContainerGap()
										.addGroup(
												jPanel1Layout
														.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
														.addGroup(
																javax.swing.GroupLayout.Alignment.TRAILING,
																jPanel1Layout
																		.createSequentialGroup()
																		.addComponent(changeMonthButton)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																		.addComponent(m_jPrintCash))
														.addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE,
																javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
														.addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE,
																javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
														.addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE,
																javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
										.addContainerGap()));
		jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(
						jPanel1Layout
								.createSequentialGroup()
								.addContainerGap()
								.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE,
										javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE,
										javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE,
										javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
								.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 31,
										Short.MAX_VALUE)
								.addGroup(
										jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
												.addComponent(changeMonthButton).addComponent(m_jPrintCash))
								.addContainerGap()));

		add(jPanel1, java.awt.BorderLayout.CENTER);
	}// </editor-fold>//GEN-END:initComponents

	private void m_jPrintCashActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_jPrintCashActionPerformed

		// print report
		printPayments(PRINTER_MONTHLY_REPORT); // Printer.CloseCash

	}//GEN-LAST:event_m_jPrintCashActionPerformed

	private JButton createChangeMonthButton() {
		JButton button = new JButton();
		button.setText(AppLocal.getIntString("Button.ChangeMonth")); // NOI18N
		button.addActionListener(new java.awt.event.ActionListener() {

			@Override
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				try {
					m_PaymentsToClose = new PaymentsModelLoader(m_App.getSession(), currentMonth, currentYear)
							.getPaymentsModel();
					loadData();
				}
				catch (BasicException e) {
					throw new RuntimeException(e);
				}

			}
		});
		return button;
	}

	private JPanel createMonthSelection() {

		Calendar c = Calendar.getInstance();
		currentMonth = c.get(Calendar.MONTH);
		currentYear = c.get(Calendar.YEAR);

		JComboBox monthSelection = createMonthComboBox(c);
		JComboBox yearSelection = createYearComboBox();

		JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		panel.add(monthSelection);
		panel.add(yearSelection);

		return panel;
	}

	private JComboBox createYearComboBox() {
		final String[] years = new String[Calendar.getInstance().get(Calendar.YEAR) - BASE_YEAR + 1];
		for (int y = 0; y < years.length; y++) {
			years[y] = String.valueOf(BASE_YEAR + y);
		}

		JComboBox yearSelection = new JComboBox(years);
		yearSelection.setSelectedIndex(currentYear - BASE_YEAR);
		yearSelection.getModel().addListDataListener(new EmptyListDataListener() {

			@Override
			public void contentsChanged(ListDataEvent e) {
				String selectedYear = (String)((ComboBoxModel)e.getSource()).getSelectedItem();
				for (int year = 0; year < years.length; year++) {
					if (selectedYear.equals(years[year]))
						currentYear = BASE_YEAR + year;
				}
			}

		});
		return yearSelection;
	}

	private JComboBox createMonthComboBox(Calendar c) {
		final String[] months = new String[12];
		SimpleDateFormat sdf = new SimpleDateFormat("MMMMM");

		for (int month = 0; month < months.length; month++) {
			c.set(currentYear, month, 1);
			months[month] = sdf.format(c.getTime());
		}

		JComboBox monthSelection = new JComboBox(months);
		monthSelection.setSelectedIndex(currentMonth);
		monthSelection.getModel().addListDataListener(new EmptyListDataListener() {

			@Override
			public void contentsChanged(ListDataEvent e) {
				String selectedMonth = (String)((ComboBoxModel)e.getSource()).getSelectedItem();
				for (int month = 0; month < months.length; month++) {
					if (selectedMonth.equals(months[month]))
						currentMonth = month;
				}
			}
		});
		return monthSelection;
	}

	// Variables declaration - do not modify//GEN-BEGIN:variables
	private javax.swing.JLabel jLabel1;
	private javax.swing.JLabel jLabel11;
	private javax.swing.JLabel jLabel12;
	private javax.swing.JLabel jLabel2;
	private javax.swing.JLabel jLabel3;
	private javax.swing.JLabel jLabel4;
	private javax.swing.JLabel jLabel5;
	private javax.swing.JLabel jLabel6;
	private javax.swing.JLabel jLabel7;
	private javax.swing.JPanel jPanel1;
	private javax.swing.JPanel jPanel4;
	private javax.swing.JPanel jPanel5;
	private javax.swing.JPanel jPanel6;
	private javax.swing.JTextField m_jCash;
	private javax.swing.JTextField m_jCount;
	private javax.swing.JTextField m_jMaxDate;
	private javax.swing.JTextField m_jMinDate;
	private javax.swing.JButton m_jPrintCash;
	private javax.swing.JTextField m_jSales;
	private javax.swing.JTextField m_jSalesSubtotal;
	private javax.swing.JTextField m_jSalesTaxes;
	private javax.swing.JTextField m_jSalesTotal;
	private javax.swing.JScrollPane m_jScrollSales;
	private javax.swing.JScrollPane m_jScrollTableTicket;
	private javax.swing.JPanel m_jSequence;
	private javax.swing.JTable m_jTicketTable;
	private javax.swing.JTable m_jsalestable;
	// End of variables declaration//GEN-END:variables

}
